package model

type SysRoleDept struct {
	RoleId int `json:"roleId" gorm:"primarykey;comment:权限ID;not null"` // 权限id
	DeptId int `json:"deptId" gorm:"primarykey;comment:机构ID;not null"` // 机构id
}

type SysDept struct {
	DeptId      uint   `json:"deptId" gorm:"primarykey; comment:部门id;autoIncrement"` // 主键ID
	ParentId    uint   `json:"parentId" gorm:"comment:父部门id"`                        // 父部门id
	Ancestors   string `json:"ancestors" gorm:"comment:祖级列表"`                        // 祖级列表
	DeptName    string `json:"deptName" gorm:"comment:部门名称"`                         // 部门名称
	OrderNum    int    `json:"orderNum" gorm:"comment:显示顺序"`                         // 显示顺序
	Leader      string `json:"leader" gorm:"comment:负责人"`                            // 负责人
	PhoneNumber string `json:"phoneNumber" gorm:"comment:联系电话;column:phone"`         // 联系电话
	Email       string `json:"email" gorm:"comment:邮箱"`                              // 邮箱
	Status      string `json:"status" gorm:"comment:部门状态（0正常 1停用）"`                  // 部门状态（0正常 1停用）
	DelFlag     string `json:"delFlag" gorm:"comment:删除标志（0代表存在 2代表删除）"`             // 删除标志（0代表存在 2代表删除）
	Children    Depts  `json:"children" gorm:"-"`
	Operate
}

// 判断是否根节点
func (dept SysDept) IsRoot() bool {
	return dept.ParentId == 0
}

// 寻找父级节点
func (dept SysDept) HasParent(list []SysDept, index int) bool {
	for i := 0; i < len(list); i++ {
		if i != index && dept.ParentId == list[i].DeptId {
			return true
		}
	}

	return false
}

type Depts []SysDept

func (d Depts) Len() int           { return len(d) }
func (d Depts) Swap(i, j int)      { d[i], d[j] = d[j], d[i] }
func (d Depts) Less(i, j int) bool { return d[i].OrderNum < d[j].OrderNum }

// 根据根节点递归寻找子节点
func (d Depts) SyntheticTree(list []SysDept) {
	for i := 0; i < len(d); i++ {
		d := &d[i]
		for _, v := range list {
			if d.DeptId == v.ParentId {
				d.Children = append(d.Children, v)
			}
		}
		d.Children.SyntheticTree(list)
	}
}

// 构建根节点树
func (d Depts) GetRootTree() (children Depts) {
	for index, v := range d {
		if v.IsRoot() || !v.HasParent(d, index) {
			children = append(children, v)
		}
	}
	return children
}
